package DingTalk

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
)

// DingTalkMessage 定义钉钉机器人消息结构
type DingTalkMessage struct {
	MsgType string `json:"msgtype"` // 消息类型，文本消息为"text"
	Text    struct {
		Content string `json:"content"` // 消息内容
	} `json:"text"`
	At struct {
		AtMobiles []string `json:"atMobiles"` // @特定人的手机号
		IsAtAll   bool     `json:"isAtAll"`   // 是否@所有人
	} `json:"at"`
}

// 发送消息到钉钉机器人
func sendDingTalkMessage(webhookURL string, message DingTalkMessage) error {
	// 将消息结构体序列化为JSON
	jsonData, err := json.Marshal(message)
	if err != nil {
		return fmt.Errorf("failed to marshal message: %v", err)
	}

	// 创建HTTP POST请求
	req, err := http.NewRequest("POST", webhookURL, bytes.NewBuffer(jsonData))
	if err != nil {
		return fmt.Errorf("failed to create request: %v", err)
	}
	req.Header.Set("Content-Type", "application/json; charset=utf-8")

	// 发送请求
	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return fmt.Errorf("failed to send request: %v", err)
	}
	defer resp.Body.Close()

	// 读取响应
	respBody, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return fmt.Errorf("failed to read response: %v", err)
	}

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("failed to send message, status code: %d, response: %s", resp.StatusCode, respBody)
	}

	return nil
}

//	SendMessageToDingTalk
//
// 描述信息： 发送加入团队邀请消息给指定手机号
//
// Param：
//
//	webhookURL ：通讯地址
//	phoneNumber ：手机号
//	captainName ：队长名称
//	teamName ：团队名
//
// Return：
//
//	error ：错误信息
func SendMessageToDingTalk(webhookURL string, phoneNumber string, captainName string, teamName string) error {
	// 构造消息内容
	message := DingTalkMessage{
		MsgType: "text",
		Text: struct {
			Content string `json:"content"`
		}{
			Content: fmt.Sprintf("消息通知：队长%s诚邀你加入%s项目团队", captainName, teamName), // 消息内容
		},
		At: struct {
			AtMobiles []string `json:"atMobiles"`
			IsAtAll   bool     `json:"isAtAll"`
		}{
			AtMobiles: []string{phoneNumber}, // 指定手机号
			IsAtAll:   false,                 // 不@所有人
		},
	}

	// 调用发送消息的函数
	return sendDingTalkMessage(webhookURL, message)
}

// SendMessageToDingTalkDeploySuccess
//
// 描述信息： 发送项目部署成功的消息并@全体成员
//
// Param：
//
//	webhookURL ：通讯地址
//	projectName ：项目名
//	teamName ：团队名
//	url ：部署的URL
//
// Return：
//
//	error ：错误信息
func SendMessageToDingTalkDeploySuccess(webhookURL string, projectName string, teamName string, url string) error {
	// 构造消息内容
	fmt.Println(webhookURL, projectName, teamName, url)
	message := DingTalkMessage{
		MsgType: "text",
		Text: struct {
			Content string `json:"content"`
		}{
			Content: fmt.Sprintf("消息通知：%s团队的%s项目已经部署成功，端口号为：%s", teamName, projectName, url),
		},
		At: struct {
			AtMobiles []string `json:"atMobiles"`
			IsAtAll   bool     `json:"isAtAll"`
		}{
			AtMobiles: []string{},
			IsAtAll:   true,
		},
	}

	// 调用发送消息的函数
	return sendDingTalkMessage(webhookURL, message)
}

// SendMessageToDingTalkTeamDisbanded 发送解散团队的消息
func SendMessageToDingTalkTeamDisbanded(webhookURL string) error {
	// 构造消息内容
	message := DingTalkMessage{
		MsgType: "text",
		Text: struct {
			Content string `json:"content"`
		}{
			Content: fmt.Sprintf("团队解散消息通知：您的团队由于违规操作已被管理员解散，详情请联系：3308472749@qq.com"),
		},
		At: struct {
			AtMobiles []string `json:"atMobiles"`
			IsAtAll   bool     `json:"isAtAll"`
		}{
			AtMobiles: []string{},
			IsAtAll:   true,
		},
	}
	// 调用发送消息的函数
	return sendDingTalkMessage(webhookURL, message)
}

// SendDockerRunMessageToDingTalk  发送解散团队的消息
func SendDockerRunMessageToDingTalk(webhookURL string) error {
	// 构造消息内容
	message := DingTalkMessage{
		MsgType: "text",
		Text: struct {
			Content string `json:"content"`
		}{
			Content: fmt.Sprintf("容器消息通知：您的项目团队容器已经恢复运行，详情请联系：3308472749@qq.com"),
		},
		At: struct {
			AtMobiles []string `json:"atMobiles"`
			IsAtAll   bool     `json:"isAtAll"`
		}{
			AtMobiles: []string{},
			IsAtAll:   true,
		},
	}
	// 调用发送消息的函数
	return sendDingTalkMessage(webhookURL, message)
}

// SendDockerStopMessageToDingTalk  发送解散团队的消息
func SendDockerStopMessageToDingTalk(webhookURL string) error {
	// 构造消息内容
	message := DingTalkMessage{
		MsgType: "text",
		Text: struct {
			Content string `json:"content"`
		}{
			Content: fmt.Sprintf("容器消息通知：您的项目团队容器占用资源过大已被管理员停止，详情请联系：3308472749@qq.com"),
		},
		At: struct {
			AtMobiles []string `json:"atMobiles"`
			IsAtAll   bool     `json:"isAtAll"`
		}{
			AtMobiles: []string{},
			IsAtAll:   true,
		},
	}
	// 调用发送消息的函数
	return sendDingTalkMessage(webhookURL, message)
}
